//
//  LWComposePictureCollectionView.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/19.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit

//列数 Int类型 为了方便，我们定义成CGFloat类型
private let colNums: CGFloat = 3
//  重用标记
private let LWComposePictureViewCellIdentifier = "LWComposePictureViewCellIdentifier"

class LWComposePictureCollectionView: UICollectionView {

    //记录一下传过来的发送按钮  当有图片的时候  让这个按钮可以点击 没图片的时候 不能点击
    var sendBtn: UIBarButtonItem?
    
    
  
    //  点击加号按钮执行闭包 点击加号按钮 要进入相册选照片
    var didSelectedAddClosure: (()->())?
    
    //数组  用于存储添加的图片  即从相册选中的图片 存储到这个数组中
    lazy var imagesArr = [UIImage]()
    
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        
        let flowLayout = UICollectionViewFlowLayout()
 
        super.init(frame: frame, collectionViewLayout: flowLayout)
        
        aboutCollectionView()
        
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    //MARK: - 有关CollectionView
    private func aboutCollectionView() {
        
        backgroundColor = UIColor.lightGrayColor()
        
        //注册cell
        registerClass(LWComposePictureCollectionViewCell.self, forCellWithReuseIdentifier: LWComposePictureViewCellIdentifier)
        
        
        //设置数据源代理
        dataSource = self
        
        //  设置代理
        delegate = self
        
        //默认隐藏  让这个视图一出现就是隐藏的  知道添加了图片才出现
        hidden = true
        
        
    }
    
    
    
    
    //MARK: - 添加图片
    //这个方法暴露给外界  让外界将图片传进来 然后我们就能拿到外界传进来的图片了,再在这里添加到数组中  这样我们的属性没有暴露在外界  相对来说安全得多
    func addImageAndBarButton(image: UIImage, sendBtn: UIBarButtonItem) {
        
        //外界传进来图片后,视图就有图片了 这时我们要显示视图
        hidden = false

        //将传进来的图片添加到数组中
        imagesArr.append(image)
        
        //有照片传进来 那么就可以点击
        sendBtn.enabled = (imagesArr.count > 0)
        
        //记录一下 button
        self.sendBtn = sendBtn
        
        
        //刷新数据 就行
        reloadData()

    }
    
    
    
    
    //MARK: - 布局 对cell布局
    //这里对子控件布局 需要拿到当前控件(即当前的CollectionView)的frame  所以需要在layoutSubView里面才能获取父控件的frame
    override func layoutSubviews() {
        
        super.layoutSubviews()
        
        //间距
        let itemMargin: CGFloat = 5
        
        //每个Item的大小 width = self.width
        let itemW = (width - (colNums - 1) * itemMargin) / colNums
        
        //设置每个cell的大小和间距
        //需要获取flowLayout
        let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
        
        //设置大小
        flowLayout.itemSize =  CGSize(width: itemW, height: itemW)
        
        //设置水平间距
        flowLayout.minimumInteritemSpacing = itemMargin
        
        //设置垂直间距
        flowLayout.minimumLineSpacing = itemMargin

        
    }
    
    
    
}




extension LWComposePictureCollectionView: UICollectionViewDataSource, UICollectionViewDelegate {
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        
        if imagesArr.count < 9 && imagesArr.count > 0 {
            
            //如果数组个数是在 1-9 之间 为了让后面显示一个加号的图片 我们返回的cell个数需要多一个 所以要 +1
            return imagesArr.count + 1
            
        }
        
        //如果不是 1-9 那么就是 0 或者 9  那么就直接返回数组个数 加号也没有 没有图片  视图不显示 加号自然不用添加 视图容纳满了  也不用显示加号  也没地方显示  所以也不用加号
        return imagesArr.count
        
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(LWComposePictureViewCellIdentifier, forIndexPath: indexPath) as! LWComposePictureCollectionViewCell
        
        
        //判断 最后一个cell 因为我们返回的cell的总数要比数组的索引要大1  因为数组的个数加了一个1  不判断 从数组中用cell得索引去取值 会超过数组的索引
        //cell的索引是从零开始的 如果cell的索引等于数组元素个数  一般是比数组个数小1  但我们返回的cell个数是数组元素个数加了个1
        if indexPath.item == imagesArr.count {
            
            cell.image = nil
            
        }else {
            
            
            cell.image = imagesArr[indexPath.item]
            
        }
        
        
        //闭包 实现删除按钮的功能的闭包
        cell.deleteButtonClosure = {
            
            //删除指定的图片  我们点击删除按钮的时候 系统自动知道我们点击的是哪个cell上的删除按钮  有那个didselected的系统方法
            self.imagesArr.removeAtIndex(indexPath.item)
            
            //没有数据了 那么隐藏视图
            if self.imagesArr.count == 0 {
                
                self.hidden = true
                
                //不可用
                self.sendBtn?.enabled = false
                
            }
            
            //删除了数组中的元素 一定要刷新
            self.reloadData()
            
        }
        
        
        return cell
        
        
    }
    
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
        //cell的索引等于数组个数 那么就表示这个cell是加号按钮
        if indexPath.item == imagesArr.count {
            
            //取消选择,支持高亮图片
            collectionView.deselectItemAtIndexPath(indexPath, animated: true)
            
            //执行闭包  进入相册
            didSelectedAddClosure?()
            
            
        }
        
        
    }
    
    
    
    
    
    
    
    
}


class LWComposePictureCollectionViewCell: UICollectionViewCell {
    
    //实现删除按钮的闭包
    var deleteButtonClosure: (()->())?
    
    //这个是暴露给外界的  接收外界传过来的图片 为pictureImageView 附图
    var image: UIImage? {
        
        
        didSet {
            
            //如果传入的图片为nil 也即是 当我们判断最后一个cell的indextPath.item == 数组的个数时,我们需要传给最后这个cell的image为nil  这时cell接收到这个nil 那么我们就显示加号
            if image == nil {
                
                //加号按钮显示
                pictureImageView.image = UIImage(named: "compose_pic_add")
                
                //隐藏删除按钮
                deleteBtn.hidden = true
                
            }else {
                
                //设置选中的图片
                pictureImageView.image = image
                
                //显示删除按钮
                deleteBtn.hidden = false
                
                
            }
            
            
            
        }
        
        
        
        
    }
    
    //MARK: - 懒加载控件
    //图片  先用一张默认图片
    private lazy var pictureImageView: UIImageView = UIImageView(image: UIImage(named: "timeline_image_placeholder"))
    
    //删除按钮
    private lazy var deleteBtn: UIButton = {
        
        let button = UIButton()
        
        button.setImage(UIImage(named: "compose_photo_close"), forState: .Normal)
        
        //添加事件
        button.addTarget(self, action: "deletePicture", forControlEvents: .TouchUpInside)
        
        return button
        
    }()
    
    
    override init(frame: CGRect) {
        
        super.init(frame: frame)
        
        layoutUI()
        
        
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    
    
    //MARK: - 布局
    private func layoutUI() {
        
        contentView.addSubview(pictureImageView)
        contentView.addSubview(deleteBtn)
        
        pictureImageView.snp_makeConstraints { (make) -> Void in
            
            make.edges.equalTo(contentView).offset(UIEdgeInsetsZero)
            
            
        }
        
        
        deleteBtn.snp_makeConstraints { (make) -> Void in
            
            make.trailing.top.equalTo(pictureImageView)
            
        }
        
        
        
        
    }
    
    
    
    //MARK: - 删除按钮点击事件
    //要删除tabbleView collectionView 中的cell上的内容  我们只需要删除存储cell内容的数组中的元素就行 然后刷新一下即可 因为cell的内容就是从数组中取的  移除数组元素 那么那个cell自然就没值了  也就删除了   这里使用闭包来实现按钮点击事件  因为数组在 collectionView 中 不在这里
    @objc private func deletePicture() {
        
        deleteButtonClosure?()
        
    }
    
    
    
    
    
    
}







